/*

dp[i][j]=前i个牛发生j次逃跑时序列不一致的数量最小数目

dp[i][j]=min(dp[k][j-1]+cnt[k+1][i])

dp[i][j]=inf

dp[i][1]=cnt[1][i]

*/

#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;

const ll inf=1e9;

#define p2v(arr)do{\
    std::cout<<#arr<<":\n";\
    for(auto&i:(arr)){\
        for(auto&j:i){\
            std::cout<<j<<", ";\
        }\
        std::cout<<"\n";\
    }\
}while(0)

int main(){
    std::iostream::sync_with_stdio(false);
    std::cin.tie(nullptr);

    ll n;
    std::cin>>n;
    std::vector<std::vector<ll>> dp(n+1,std::vector<ll>(n+1, inf)),
            cnt(n+1,std::vector<ll>(n+1));
    std::vector<ll> arr(n+1);
    for(ll i=1;i<=n;i++){
        std::cin>>arr[i];
    }
    /*
    cost[i][j] 表示在区间 [i, j] 内，假设第 i 天发生逃跑，
    并且在 (i, j] 区间内没有其他逃跑发生时，需要修改的记录数。
    */
    for(ll i=1;i<=n;i++){
        ll mis=0;
        for(ll j=i;j<=n;j++){
            if(j-i!=arr[j]){
                mis++;
            }
            cnt[i][j]=mis;
        }
    }
    // p2v(cnt);
    for(ll i=1;i<=n;i++){
        dp[i][1]=cnt[1][i];
    }
    for(ll i=1;i<=n;i++){
        for(ll j=2;j<=n;j++){
            for(ll k=j-1;k<i;k++){
                dp[i][j]=std::min(
                    dp[i][j],
                    dp[k][j-1]+cnt[k+1][i]
                );
            }
        }
    }
    for(ll j=1;j<=n;j++){
        std::cout<<dp[n][j]<<"\n";
    }
}